"""
声明和jwt相关的工具类或方法
"""
import jwt
import datetime
from jwt import exceptions
from meiduo_move_server.settings import SECRET_KEY  # 获取django自动生成的项目密钥
from user.user_constants import TOKEN_VALID_TIME  # token的有效时间


def create_token(userAccount, userPassword, userId):
    """
    根据用户的账号或手机号和密码生成对应的token

    @param - userAccount: 用户账号或手机号
    @param - userPassword: 用户账号密码

    @return: 返回用户账号对应的token
    """
    # 构造header，JWT的元数据
    headers = {
        'typ': 'jwt',  # 令牌类型，JWT
        'alg': 'HS256'  # 生成签名算法
    }
    # 构造payload，存放实际数据
    payload = {
        'userAccount': userAccount,  # token中包含的数据
        'userPassword': userPassword,  # token中包含的数据
        'userId': userId, # 用户id
        'exp': datetime.datetime.utcnow() + datetime.timedelta(days=TOKEN_VALID_TIME)  # 设置token过期时间
    }
    token = jwt.encode(payload=payload, key=SECRET_KEY, algorithm="HS256", headers=headers)
    return token


def get_payload(token):
    """
    获取token中的payload，判断token是否有效，如果token有效返回payload中的包含数据，否则返回None

    @param - token: token

    @return: 如果token有效返回payload中的包含数据，否则返回None
    """
    try:
        # 从token中获取payload【校验合法性】
        verified_payload = jwt.decode(jwt=token, key=SECRET_KEY, algorithms=['HS256'])
        # print(verified_payload)
        return verified_payload
    except exceptions.ExpiredSignatureError:
        # print('token已失效')
        return None
    except jwt.DecodeError:
        # print('token认证失败')
        return None
    except jwt.InvalidTokenError:
        # print('非法的token')
        return None

if __name__ == '__main__':
    token = create_token('15892014635', '11111111')
    # token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6Imp3dCJ9.eyJ1c2VyQWNjb3VudCI6IjE1ODkyMDE0NjM1IiwidXNlclBhc3N3b3JkIjoiMTExMTExMTEiLCJleHAiOjE2Njk0NDYxMzZ9.z_S3LUmte-zCIyRbeANIDIWdQIt25Q8mXI-34RhaBIk'
    signing_input, crypto_segment = token.rsplit('.', 1)
    header_segment, payload_segment = signing_input.split('.', 1)
    print(token)
    print(signing_input)
    print(payload_segment)
    # 从token中获取payload【校验合法性】
    try:
        # 从token中获取payload【不校验合法性】
        # unverified_payload = jwt.decode(token, None, False)
        # print(unverified_payload)
        # 从token中获取payload【校验合法性】
        verified_payload = jwt.decode(jwt=token, key=SECRET_KEY, algorithms=['HS256'])
        # return verified_payload
        print(verified_payload)
    except exceptions.ExpiredSignatureError:
        print('token已失效')
    except jwt.DecodeError:
        print('token认证失败')
    except jwt.InvalidTokenError:
        print('非法的token')

